package cn.tedu;
//测试 JDBC
//JDBC用来把java程序和数据库连接起来,目的是通过java代码操作数据库
public class TestJdbc {
    public static void main(String[] args) throws Exception {
        //        method();//普通方式
        //        method2();//暴露SQL注入问题
        method3();//解决SQL注入问题
    }
    //需求:按照 用户名 和 密码 查询用户信息
    private static void method3(){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //TODO  改造 调用工具类,获取和数据库的连接
            conn = JDBCUtils.getConnection();
            //获取传输器Statement,执行SQL
            //        Statement st = conn.createStatement();//SQL注入攻击问题
            //        String sql = "select * from user where name='"+a+"' and pwd='"+b+"'";

            //获取传输器PrepareStatement,执行SQL
            //?叫做占位符,PreparedStatement只把SQL骨架发送给数据库
            String sql = "select * from user where name=? and pwd=?";
            ps = conn.prepareStatement(sql);
            //给SQL设置参数
            ps.setString(1, "jack");//第一个?设置参数
            ps.setString(2, "123");//第二个?设置参数
            //执行SQL
            rs = ps.executeQuery();
            //解析结果集
            while (rs.next()) {
                for (int i = 1; i <= 3; i++) {
                    //按照索引查
                    System.out.println(rs.getString(i));
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally{ //释放资源,一定要被执行 !!!
            //调用工具,完成关闭资源
            JDBCUtils.close(rs,ps,conn);
        }
    }
    //暴露SQL注入问题--发生了SQL拼接
    //需求:按照 用户名 和 密码 查询用户信息
    private static void method2() throws Exception {
        //中文查不出来数据:
        //String url="jdbc:mysql://localhost:3306/jdbctest?characterEncoding=utf8";
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        String url="jdbc:mysql://localhost:3306/jdbctest";
        String name="root";
        String pwd="root";
        Connection conn = DriverManager.getConnection(url,name,pwd);
        //获取传输器Statement,执行SQL
        Statement st = conn.createStatement();

        //TODO 测试SQL注入攻击问题
        //是指当用户只输入数据时,恶意包含了特殊的SQL语句,改变了SQL语义
        //导致只需要名字不需要密码也可以查看所有数据(数据泄露)
        //名字输入后面两种值,都会产生SQL攻击问题: jack'# 或者 jack' or '1=1
        String a = new Scanner(System.in).nextLine();
        String b = new Scanner(System.in).nextLine();
        String sql = "select * from user where name='"+a+"' and pwd='"+b+"'";
        //执行SQL
        ResultSet rs = st.executeQuery(sql);
        //解析结果集
        while(rs.next()){
            for (int i = 1; i <= 3 ; i++) {
                //按照索引查
                System.out.println(rs.getString(i));
            }
        }
        //释放资源
        rs.close();
        st.close();
        conn.close();
    }
    //使用JDBC查询user表的数据
    private static void method() throws Exception {
        //1,注册驱动(jar包)
        Class.forName("com.mysql.jdbc.Driver");
        //2,连接数据库
        //getConnection(1,2,3)-1是要连接哪个数据-2是用户名-3是密码
        Connection con = DriverManager.getConnection(
                //                "协议//服务器的名字:数据库的端口号/数据库名",
                //                "jdbc:mysql://localhost:3306/jdbctest",
                "jdbc:mysql:///jdbctest",
                //url简写(使用本机使用默认的端口号)
                "root","root");
        //3,获取传输器Statement
        Statement st = con.createStatement();
        //4,执行SQL
        String sql = "select * from user";
        ResultSet rs = st.executeQuery(sql);
        //5,解析结果集
        while(rs.next()){ //next()判断有数据吗
            //有数据就一个一个解析id/name/pwd
            for (int i = 1; i <= 3; i++) {
                System.out.println( rs.getString(i) );//按索引查;
            }

            String id2 = rs.getString("id");//按索引查
            String name2 = rs.getString("name");//按索引查
            String pwd2 = rs.getString("pwd");//按索引查
            System.out.println(id2+name2+pwd2);
        }
        //6,释放资源
        rs.close();
        st.close();
        con.close();
    }
}